package it.scambiocorse.dao;

import java.sql.Types;
import it.scambiocorse.model.AreaType;
import it.scambiocorse.model.AutistaType;
import it.scambiocorse.model.ClienteType;
import it.scambiocorse.model.JTableType;
import it.scambiocorse.model.ServizioJson;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.SorgenteType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.rowmapper.AreaRowMapper;
import it.scambiocorse.rowmapper.AutistaRowMapper;
import it.scambiocorse.rowmapper.ServizioRowMapper;
import it.scambiocorse.rowmapper.SorgenteRowMapper;
import it.scambiocorse.utils.Costanti;
import it.scambiocorse.utils.Utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.mysql.jdbc.CallableStatement;

public class AreaDao extends JdbcDaoSupport implements AreaService  {
	
	final Logger logger = Logger.getLogger(getClass());

  protected void initDao() throws Exception {
    super.initDao();
    getJdbcTemplate().setNativeJdbcExtractor(new SimpleNativeJdbcExtractor());
  }
  
  
  


  
  
	public ArrayList<AreaType> listaAreePrivate(int idSogg) throws Exception {
		String metodo = "listaAreePrivate(...)";
		logger.warn(metodo+" - Inizio");
	  ResultSet rs = null; 
	  List ret = null;
	  String sql = "call scambio.listaAreePrivate(?)";
	  try{ 
	  	
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idSogg);
	  	ret = (List<AreaType>) getJdbcTemplate().query(sql, new Object[] { idSogg }, new AreaRowMapper());
	  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
	  // Do whatever I want with resultset here... 
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+"La lista e' "+((ret == null) ? "NULL" : "PIENA"));
	  logger.warn(metodo+" Fine");
	  
		return (ArrayList<AreaType>)ret;
	}






	@Transactional
	public int inserisciArea(AreaType area) throws Exception {
		String metodo = "inserisciArea(...) - ";
		logger.warn(metodo+"Inizio");
	  Number idArea;
//	  String sql = "call inserisciArea(?,?,?,?,?)";
	  try{ 
	  	
	  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
	  	.withFunctionName("inserisciArea");
	  	
	  	Map<String, Object> dati = new HashMap<String, Object>();
	  	
	  	dati.put("id_user", area.getIdOwner());
	  	dati.put("nome_owner", area.getNomeOwner());
	  	dati.put("nome_area", area.getNomeArea());
	  	dati.put("tipo_area", area.getTipoArea());

			
			idArea = caller.executeFunction(Number.class, dati);
			
	  	if (idArea != null && idArea.intValue() > 0) {
	  		logger.warn(metodo+" Esito: OK, area INSERITA, idArea = "+idArea.intValue());
	  	} else {
	  		idArea = 0;
	  		logger.warn(metodo+" Attenzione: area NON INSERITA");
	  	}
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \"");//+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  return idArea.intValue();
	}







//	@Transactional
//	public int inserisciAutista(AutistaType autista) throws Exception {
//		String metodo = "inserisciAutista(...) - ";
//		logger.warn(metodo+"Inizio");
//	  Number idAut;
////	  String sql = "call inserisciArea(?,?,?,?,?)";
//	  try{ 
//	  	
//	  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
//	  	.withFunctionName("inserisciAutista");
//	  	
//	  	Map<String, Object> dati = new HashMap<String, Object>();
//	  	
//	  	dati.put("id_user", autista.getIdUserInse());
//	  	dati.put("nome", autista.getNome());
//	  	dati.put("email", autista.getEmail());
//	  	dati.put("tel", autista.getTel());
//
//			
//	  	idAut = caller.executeFunction(Number.class, dati);
//			
//	  	if (idAut != null && idAut.intValue() > 0) {
//	  		logger.warn(metodo+" Esito: OK, autista INSERITO, idArea = "+idAut.intValue());
//	  	} else {
//	  		idAut = 0;
//	  		logger.warn(metodo+" Attenzione: autista NON INSERITA");
//	  	}
//	  	
//	  } catch (Exception e) {
//	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \"");//+sql);
//	  	logger.error(e);
//	  	throw e;
//	  }
//	  
//	  logger.warn(metodo+" Fine");
//	  
//	  return idAut.intValue();
//	}

	@Transactional(  propagation = Propagation.REQUIRED,
		    isolation = Isolation.DEFAULT,
		    readOnly = false)
	public int inserisciAutista(AutistaType a) throws Exception {
		String metodo = "inserisciAutista(...) - ";
		logger.warn(metodo+"Inizio");
	  Number idServ = 0;
	  try{ 
		  
		
		  // IMPOSTO ID_AUTISTA_USER
		  	int idAutistaUser = 1;
			  String sql = "select max(id_autista_user)+1 from autista_tab where id_user_inse = ?";
			  idAutistaUser = getJdbcTemplate().queryForInt(sql, new Object[] {a.getIdUserInse()});  
			  
			  if (idAutistaUser == 0) {
				  idAutistaUser = 1; //NEL CASO DI PRIMO INSERIMENTO 
			  }
			  a.setIdAutistaUser(idAutistaUser);
			// FINE IMPOSTO ID_AUTISTA_USER
		  
		NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
			KeyHolder keyHolder = new GeneratedKeyHolder();
			this.getJdbcTemplate().update(new PSCAutista(a),keyHolder);



			idServ = keyHolder .getKey().longValue();


	  	if (idServ.intValue() > 0) {
	  		logger.warn(metodo+" Esito: OK, servizio INSERITO, idServ = "+idServ.intValue());
	  	} else {
	  		logger.warn(metodo+" Attenzione: servizio NON INSERITO");
	  		idServ = 0;
	  	}
	  	
	  } catch (Exception e) {
//	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  
	  
	return idServ.intValue();
	  
	}
  





	public boolean esisteAreaByNome(String nomeArea) {
		String metodo = "esisteAreaByNome(...)";
		logger.warn(metodo+" - Inizio");
		  ResultSet rs = null; 
		  List list = null;
		  boolean ret = false;
		  String sql = "select * from scambio.area_tab where nome_area = ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+nomeArea);
			  	list = (List<AreaType>) getJdbcTemplate().query(sql, new Object[] { nomeArea }, new AreaRowMapper());
			  	
			  	if (list != null && list.size() > 0) {
			  		ret = true;
			  	}
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+list.size());
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return ret;
	}

	
	public ArrayList<UtenteType> listaPartecipanti(int idAreaRequest) throws Exception {
		String metodo = "listaPartecipanti(...)";
		logger.warn(metodo+" - Inizio");
		SqlRowSet  rs = null; 
		ArrayList<UtenteType> ret = new ArrayList<UtenteType>();
		  String sql = "select utente_tab.id_user, utente_tab.login, aree_part_tab.access from scambio.aree_part_tab, scambio.utente_tab " +
		  				"where aree_part_tab.id_user = utente_tab.id_user and aree_part_tab.id_area = ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idAreaRequest);
			  	  rs = getJdbcTemplate().queryForRowSet(sql, new Object[] { idAreaRequest }, new int[] {Types.INTEGER});
			  	  while (rs.next()) {
			  		UtenteType u = new UtenteType();
			  		u.setLogin(rs.getString("login"));
			  		u.setIdUser(rs.getInt("id_user"));
			  		u.setTipoAccesso(rs.getInt("access"));
			  		ret.add(u);
			  	  }
			  	  
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return ret;
		
	}
	
	
	public ArrayList<AutistaType> listaAutistiIdUser(int idUser) throws Exception {
		String metodo = "listaAutistiIdUser(...)";
		logger.warn(metodo+" - Inizio");
		List ret = new ArrayList<AutistaType>();
		  String sql = "select * from autista_tab where id_user_inse = ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
			  	  ret = getJdbcTemplate().query(sql, new Object[] { idUser }, new AutistaRowMapper());
//			  	  while (rs.next()) {
//			  		AutistaType a = new AutistaType();
//			  		a.setIdAutista(rs.getInt("id_autista"));
//			  		a.setIdUserInse(rs.getInt("id_user_inse"));
//			  		a.setNome(rs.getString("nome"));
//			  		a.setTel(rs.getString("tel"));
//			  		a.setEmail(rs.getString("email"));
//			  		a.setDataInse(rs.getTimestamp("data_inse"));
//
//			  		ret.add(a);
//			  	  }
			  	  
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return (ArrayList<AutistaType>)ret;
		
	}
	
	
	public int tipoAccessoUtenteByArea(int idUser, int idAreaRequest) throws Exception {
		String metodo = "tipoAccessoUtenteByArea(...)";
		logger.warn(metodo+" - Inizio");
		int  ret = 0; 
		  String sql = "select aree_part_tab.access from scambio.aree_part_tab " +
		  				"where aree_part_tab.id_user = ? and aree_part_tab.id_area = ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idAreaRequest);
			  	  ret = getJdbcTemplate().queryForInt(sql, new Object[] { idUser, idAreaRequest });
			
			  	logger.warn(metodo+" Esito: OK, Tipo Accesso: "+ret);
	  } catch (Exception e) {
	  	logger.error(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return ret;		
	}

		
	
	
	@Transactional
	public void associaUtente(int appoIdArea, int idUser, Integer tipoAcc) throws Exception {
			String metodo = "associaUtente(...) - ";
			logger.warn(metodo+"Inizio");
			Number ret = 0;
			try{ 
		  	
		  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
		  	.withFunctionName("associaUtente");
		  	
		  	Map<String, Object> map = new HashMap<String, Object>(2);
		  	map.put("id_area", appoIdArea);
		  	map.put("id_user", idUser);
		  	map.put("tipoAcc", tipoAcc);
		  	
		  	
		  	ret = caller.executeFunction(Number.class, map);
	
		  	if (ret.intValue() > 0) {
		  		logger.warn(metodo+" Esito: OK, ASSOCIAZIONE INSERITA, id_part = "+ret.intValue());
		  	} else {
		  		logger.error(metodo+" Attenzione: ASSOCIAZIONE NON INSERITA");
		  	}
		  	
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+metodo);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		  
	}


//
//	@Transactional(  propagation = Propagation.REQUIRED,
//			    isolation = Isolation.DEFAULT,
//			    readOnly = false)
//	  public int inserisciSorgente(SorgenteType s) throws Exception {
//			String metodo = "inserisciSorgente(...) - ";
//			logger.warn(metodo+"Inizio");
//		  Number idServ = 0;
//		  try{ 
//			  
//			NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(this.getDataSource());
//				KeyHolder keyHolder = new GeneratedKeyHolder();
//				this.getJdbcTemplate().update(new PSCSorgente(s),keyHolder);
//	
//	
//
//				idServ = keyHolder .getKey().longValue();
//
//
//		  	if (idServ.intValue() > 0) {
//		  		logger.warn(metodo+" Esito: OK, servizio INSERITO, idServ = "+idServ.intValue());
//		  	} else {
//		  		logger.warn(metodo+" Attenzione: servizio NON INSERITO");
//		  		idServ = 0;
//		  	}
//		  	
//		  } catch (Exception e) {
////		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
//		  	logger.error(e);
//		  	throw e;
//		  }
//		  
//		  logger.warn(metodo+" Fine");
//		  
//		  
//		return idServ.intValue();
//		  
//		}
//	  



	public ArrayList<SorgenteType> listaSorgentiIdUser(int idUser) throws Exception {
		String metodo = "listaSorgentiIdUser(...)";
		logger.warn(metodo+" - Inizio");
		SqlRowSet  rs = null; 
		List ret = new ArrayList<SorgenteType>();
		  String sql = "select * from sorg_tab where id_user_inse = ?";
		  try{ 
			  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
			  	  ret = getJdbcTemplate().query(sql, new Object[] { idUser }, new SorgenteRowMapper());
			  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return (ArrayList<SorgenteType>)ret;
	}
	
	
	 public HashMap listaCollaboratoriIdUserJTable(int idUser, JTableType j) throws Exception {
			String metodo = "listaCollaboratoriIdUserJTable(...) - ";
			logger.warn(metodo+"Inizio");
			  List ret = null;
			  String sql = "";
			  	HashMap jOut = null;
				try{ 	
						 Object[] args = null;
						  
						  if (Utils.isValid(j.getJtSorting())) { // AJAX CON SORTING & PAGING
							  sql = "select * from autista_tab where id_user_inse = ? ORDER BY "+decodeAutistaColumn(j.getJtSorting())+" LIMIT ?,?";
							  logger.warn("Select con SORTING & PAGING");
//							  String orderBy = decodeColumn(j.getJtSorting());
//							  args = new Object[] { idUser, i, k, "s."+orderBy, j.getJtStartIndex(),j.getJtPageSize() };
							  args = new Object[] { idUser, j.getJtStartIndex(),j.getJtPageSize() };
							  
							  
						  } else {										// AJAX SOLO PAGING
							  sql = "select * from autista_tab where id_user_inse = ? LIMIT ?,?";
							  logger.warn("Select con SOLO con PAGING -- jtStartIndex = "+j.getJtStartIndex()+" jtPageSize = "+j.getJtPageSize());
							  args = new Object[] { idUser, j.getJtStartIndex(),j.getJtPageSize() };
						  }
						  
					  
						  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
						  	ret = (List<ServizioJson>) getJdbcTemplate().query(sql, args , new AutistaRowMapper());
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
						  	
						  	int totRows = 0;
						  	if (ret.size() > 0) {
								logger.warn("PRENDO IL TOTALE PER JTABLE");
							  	sql = "SELECT count(*) FROM autista_tab s where s.id_user_inse = ?";
								totRows =  getJdbcTemplate().queryForInt(sql, args = new Object[] { idUser } );
						  	}
						  	
						  	
						  	
						  	jOut = new HashMap<String, Object>();
							jOut.put("Result", "OK");
							jOut.put("Records", ret);
							jOut.put("TotalRecordCount", totRows);
			
						  	logger.warn( metodo+" Esito: OK, grandezza lista "+ret.size() );
				  } catch (Exception e) {
				  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
				  	logger.error(e);
				  	throw e;
				  }
		  
		    logger.warn(metodo+" Fine");
			return jOut;
		}
	
	 
	 private String decodeAutistaColumn(String j) {
			String ret = "";
			String[] ascDesc = j.split("\\s+");
			if (j.startsWith("idAutistaUser")) {
				ret = "id_autista_user";
			} else {
				ret = ascDesc[0];
			}
			
			
			return ret+" "+ascDesc[1];
		}	
	 
	
	@Transactional
	public void eliminaPart(int idUser, int idArea) throws Exception {
		String metodo = "eliminaPart(...) - ";
		logger.warn(metodo+"Inizio");
	  Number idAut;
	  String sql = "delete from aree_part_tab where id_user = ? and id_area = ?";
	  logger.warn(metodo+ " "+sql+" -----> id_user ="+idUser+" id_area="+idArea);
	  try{ 
			
	  	 int check = getJdbcTemplate().update(sql, new Object[] { idUser, idArea });
	  	 if (check > 0) {
	  		logger.warn(metodo+" Esito: OK, partecipazione eliminata, procedo allo sblocco dei servizi per l'utente "+idUser+" nell'area "+idArea);
	  	 	sql = "update serv_tab set id_user_exec = ? where id_area = ? and id_user_exec = ?";
	  	 	check = getJdbcTemplate().update(sql, new Object[] { null, idUser, idArea });
	  	 }
	  	 else {
	  		 throw new Exception(metodo+"Partecipazione non eliminata");
	  	 }
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \"");//+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	  
	}

	public AreaType findAreaById(int idArea) throws Exception {
		String metodo = "findAreaById(...)";
		logger.warn(metodo+" - Inizio");
	  AreaType ret = null;
	  String sql = "call scambio.listaAreePrivate(?)";
	  try{ 
		  	
		  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idArea);
		  	ret =(AreaType) getJdbcTemplate().queryForObject(sql, new Object[] { idArea }, new AreaRowMapper());
		  	
		  	if (ret != null )
		  		logger.warn(metodo+" Esito: OK, area estratta:  "+ret.getNomeArea());
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+"La lista e' "+((ret == null) ? "NULL" : "PIENA"));
	  logger.warn(metodo+" Fine");
	  
	  return ret;
	}







	@Transactional
	public boolean eliminaAutista(int idAutista) throws Exception {
		String metodo = "eliminaAutista(...) - ";
		boolean ret = false;
		logger.warn(metodo+"Inizio");
	  String sql = "delete from autista_tab where id_autista = ?";
	  logger.warn(metodo+ " "+sql+" -----> id_autista ="+idAutista);
	  try{ 
			
	  	 int check = getJdbcTemplate().update(sql, new Object[] { idAutista });
	  	 if (check > 0) {
	  		logger.warn(metodo+" Esito: OK, autista eliminato, procedo allo sblocco dei servizi per l'autista  "+idAutista);
	  	 	sql = "update serv_tab set id_autista = ? where id_autista = ?";
	  	 	check = getJdbcTemplate().update(sql, new Object[] { null,idAutista});
	  	 	ret = true;
	  	 }
	  	 
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	return ret;
	  
	}
	
	@Transactional(
		    propagation = Propagation.NESTED,
		    isolation = Isolation.DEFAULT,
		    readOnly = false)
	public boolean modificaAutista(AutistaType a) throws Exception {
		String metodo = "modificaAutista(...) - ";
		boolean ret = false;
		logger.warn(metodo+"Inizio");
	  String sql = "update autista_tab set nome = ?, email = ?, tel = ? where id_autista = ?";
	  logger.warn(metodo+ " "+sql+" -----> id_autista ="+a.getIdAutista());
	  try{ 
			
	  	 int check = getJdbcTemplate().update(sql, new Object[] {a.getNome(), a.getEmail(), a.getTel(), a.getIdAutista() });
	  	 if (check > 0) {
	  	 	ret = true;
	  	 }
	  	
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	return ret;
	  
	}







	@Transactional(
		    propagation = Propagation.NESTED,
		    isolation = Isolation.DEFAULT,
		    readOnly = false)
	public boolean eliminaCollaboratore(int idColl, int idUser) throws Exception {
		String metodo = "eliminaCollaboratore(...) - ";
		boolean ret = false;
		logger.warn(metodo+"Inizio");
	  String sql = "delete from autista_tab where id_autista = ?";
	  logger.warn(metodo+ " "+sql+" -----> id_autista ="+idColl);
	  try{ 
			
	  	 int check = getJdbcTemplate().update(sql, new Object[] { idColl });
	  	 if (check > 0) {
	  		 
	  		logger.warn(metodo+" Esito: OK, Collaboratore eliminato, procedo allo sblocco dei servizi per Sorgente  "+idColl);
	  	 	sql = "update serv_tab set id_sorgente = ? where id_sorgente = ? and id_user_inse = ?";
	  	 	check = getJdbcTemplate().update(sql, new Object[] { null, idColl, idUser});

	  	 	sql = "update serv_tab set id_autista = ? where id_autista = ? and id_user_inse = ?";
	  	 	check = getJdbcTemplate().update(sql, new Object[] { null, idColl, idUser});
	  	 	ret = true;
	  	 }
	  	 
	  	
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
	  	logger.error(e);
	  	throw e;
	  }
	  
	  logger.warn(metodo+" Fine");
	return ret;
	  
	}







	@Transactional(
		    propagation = Propagation.NESTED,
		    isolation = Isolation.DEFAULT,
		    readOnly = false)
	public boolean modificaCollaboratore(AutistaType a) throws Exception {
			String metodo = "modificaCollaboratore(...) - ";
			boolean ret = false;
			logger.warn(metodo+"Inizio");
		  String sql = "update autista_tab set nome = ?, tel = ?, email = ?, note = ? where id_autista = ?";
		  logger.warn(metodo+ " "+sql+" -----> id_sorg ="+a.getIdAutista());
		  try{ 
				
		  	 int check = getJdbcTemplate().update(sql, new Object[] {a.getNome(), a.getTel(), a.getEmail(), a.getNote(), a.getIdAutista() });
		  	 if (check > 0) {
		  	 	ret = true;
		  	 }
		  	
		  	
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata "+sql);
		  	logger.error(e);
		  	throw e;
		  }
		  
		  logger.warn(metodo+" Fine");
		return ret;
		  
		}



	
	
	public AutistaType dettaglioCollaboratore(int idSorgente, int idUser) throws Exception {
		String metodo = "dettaglioCollaboratore(...) - ";
		logger.warn(metodo+"Inizio");
	  String sql = "SELECT * from autista_tab where id_autista = ? and id_user_inse = ?"; 
	  AutistaType ret = null;
	  try{ 
		  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idSorgente);
		  	ret = (AutistaType) getJdbcTemplate().queryForObject(sql, new Object[] { idSorgente, idUser }, new AutistaRowMapper());
		  	logger.warn(metodo+" Esito: OK, collaboratore estratto ");
		
	  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  	throw e;
	 }
		  
		  logger.warn(metodo+" Fine");
		  return ret;
	}


	
	
	
	
	    

}


